/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_Parameter.c
** 模块名称： KD686参数配置模块
** 版 本 号： V1.0
** 作    者： 蒲磊
**
** 修改记录： 版本     修改人      时间         修改内容
**
******************************************************************************/

/******************************************************************************
* 头文件
******************************************************************************/
#include "App_Parameter.h"
/******************************************************************************
* 本文件宏定义 ('#define')
******************************************************************************/

/******************************************************************************
* 本文件类型定义 ('typedef')
******************************************************************************/

/******************************************************************************
* 本文件静态函数声明 ('static')
******************************************************************************/

/******************************************************************************
* 全局变量定义
******************************************************************************/
stPARAM		gtParam;
stRIDING	gtRiding;
uint32_t 	gulVolt_Ref;
uint16_t	gusPhotoDiode_ADC_Value;
const uint32_t     gucParamReset __attribute__((at(RESET_FLAG_ADDRESS))) = 0xFFFFFFFF;
/*****************************************************************************
* 函数实现 - global ('extern') and local ('static')
******************************************************************************/


/******************************************************************************
** 功  能：读取参数配置
** 参  数：pParam-指向参数结构体的指针
** 返回值：无
** 备  注：
******************************************************************************/
void vParam_Read(void * pParam,enPARAM_TYPE type)
{

    uint16_t Len;
    uint32_t Addr;
    if(type == ConfigInfo)
    {
        Len = sizeof(stPARAM);
        Addr = PARAMETER_ADDRESS;
    }
    else if(type == RidingInfo)
    {
        Len = sizeof(stRIDING);
        Addr = RIDING_ADDRESS;
    }
    else if(type == VoltRef)
    {
        Len = sizeof(gulVolt_Ref);
        Addr = VOLTAGE_REF_ADDRESS;
    }
    else if(type == PhotoDiode)
    {
        Len = sizeof(gusPhotoDiode_ADC_Value);
        Addr = PHOTODIODE_ADDRESS;
    }
    else
    {
        return;
    }

    EE_ReadBytes((uint8_t *)pParam,Addr,Len);				/*读取所有参数*/

}

/******************************************************************************
** 功  能：写入参数配置
** 参  数：pParam-指向参数结构体的指针
** 返回值：无
** 备  注：
******************************************************************************/
void vParam_Write(void * pParam,enPARAM_TYPE type)
{
    uint16_t Len;
    uint32_t Addr;
    if(type == ConfigInfo)
    {
        Len = sizeof(stPARAM);
        Addr = PARAMETER_ADDRESS;
    }
    else if(type == RidingInfo)
    {
        Len = sizeof(stRIDING);
        Addr = RIDING_ADDRESS;
    }
    else if(type == VoltRef)
    {
        Len = sizeof(gulVolt_Ref);
        Addr = VOLTAGE_REF_ADDRESS;
    }
    else if(type == PhotoDiode)
    {
        Len = sizeof(gusPhotoDiode_ADC_Value);
        Addr = PHOTODIODE_ADDRESS;
    }
    else
    {
        return;
    }
    EE_WriteBytes((uint8_t *)pParam,Addr,Len);		/*写入EEPROM*/
}

/******************************************************************************
** 功  能：将所有参数恢复为出厂默认值
** 参  数：pParam-指向参数结构体的指针
** 返回值：无
** 备  注：
******************************************************************************/
void vParam_ResetConfig(stPARAM * pParam)
{
    pParam->Ver 				= CURRENT_VER;					/*参数版本号*/
    pParam->Volt				= CONFIG_DEF_VOL;				/*当前系统电压值*/
    pParam->V_36_Tab[0]			= CONFIG_36V_V1;				/*36V系统电压分段值*/
    pParam->V_36_Tab[1]			= CONFIG_36V_V2;				/*36V系统电压分段值*/
    pParam->V_36_Tab[2]			= CONFIG_36V_V3;				/*36V系统电压分段值*/
    pParam->V_36_Tab[3]			= CONFIG_36V_V4;				/*36V系统电压分段值*/
    pParam->V_36_Tab[4]			= CONFIG_36V_V5;				/*36V系统电压分段值*/
    pParam->V_36_Tab[5]			= CONFIG_36V_V6;				/*36V系统电压分段值*/
    pParam->V_36_Tab[6]			= CONFIG_36V_V7;				/*36V系统电压分段值*/
    pParam->V_36_Tab[7]			= CONFIG_36V_V8;				/*36V系统电压分段值*/
    pParam->V_36_Tab[8]			= CONFIG_36V_V9;				/*36V系统电压分段值*/
    pParam->V_36_Tab[9]			= CONFIG_36V_V10;				/*36V系统电压分段值*/

    pParam->V_48_Tab[0]			= CONFIG_48V_V1;				/*48V系统电压分段值*/
    pParam->V_48_Tab[1]			= CONFIG_48V_V2;				/*48V系统电压分段值*/
    pParam->V_48_Tab[2]			= CONFIG_48V_V3;				/*48V系统电压分段值*/
    pParam->V_48_Tab[3]			= CONFIG_48V_V4;				/*48V系统电压分段值*/
    pParam->V_48_Tab[4]			= CONFIG_48V_V5;				/*48V系统电压分段值*/
    pParam->V_48_Tab[5]			= CONFIG_48V_V6;				/*48V系统电压分段值*/
    pParam->V_48_Tab[6]			= CONFIG_48V_V7;				/*48V系统电压分段值*/
    pParam->V_48_Tab[7]			= CONFIG_48V_V8;				/*48V系统电压分段值*/
    pParam->V_48_Tab[8]			= CONFIG_48V_V9;				/*48V系统电压分段值*/
    pParam->V_48_Tab[9]			= CONFIG_48V_V10;				/*48V系统电压分段值*/

    pParam->V_52_Tab[0]			= CONFIG_52V_V1;				/*52V系统电压分段值*/
    pParam->V_52_Tab[1]			= CONFIG_52V_V2;				/*52V系统电压分段值*/
    pParam->V_52_Tab[2]			= CONFIG_52V_V3;				/*52V系统电压分段值*/
    pParam->V_52_Tab[3]			= CONFIG_52V_V4;				/*52V系统电压分段值*/
    pParam->V_52_Tab[4]			= CONFIG_52V_V5;				/*52V系统电压分段值*/
    pParam->V_52_Tab[5]			= CONFIG_52V_V6;				/*52V系统电压分段值*/
    pParam->V_52_Tab[6]			= CONFIG_52V_V7;				/*52V系统电压分段值*/
    pParam->V_52_Tab[7]			= CONFIG_52V_V8;				/*52V系统电压分段值*/
    pParam->V_52_Tab[8]			= CONFIG_52V_V9;				/*52V系统电压分段值*/
    pParam->V_52_Tab[9]			= CONFIG_52V_V10;				/*52V系统电压分段值*/

    pParam->V_BMS_Tab[0]		= CONFIG_BMS_V1;				/*电量百分比分段值*/
    pParam->V_BMS_Tab[1]		= CONFIG_BMS_V2;				/*电量百分比分段值*/
    pParam->V_BMS_Tab[2]		= CONFIG_BMS_V3;				/*电量百分比分段值*/
    pParam->V_BMS_Tab[3]		= CONFIG_BMS_V4;				/*电量百分比分段值*/
    pParam->V_BMS_Tab[4]		= CONFIG_BMS_V5;				/*电量百分比分段值*/
    pParam->V_BMS_Tab[5]		= CONFIG_BMS_V6;				/*电量百分比分段值*/
    pParam->V_BMS_Tab[6]		= CONFIG_BMS_V7;				/*电量百分比分段值*/
    pParam->V_BMS_Tab[7]		= CONFIG_BMS_V8;				/*电量百分比分段值*/
    pParam->V_BMS_Tab[8]		= CONFIG_BMS_V9;				/*电量百分比分段值*/
    pParam->V_BMS_Tab[9]		= CONFIG_BMS_V10;				/*电量百分比分段值*/


    pParam->Backlight			= CONFIG_BACKLIGHT_LEVEL;		/*背光亮度等级*/
    pParam->Unit				= CONFIG_DEF_UNIT;				/*单位类型*/
    pParam->Password_Start_En	= CONFIG_START_PASSWORD_EN;		/*开机密码是否使能*/
    pParam->Password_Start		= CONFIG_START_PASSWORD;		/*默认开机密码*/
    pParam->Password_Setting_En = CONFIG_SETTING_PASSWORD_EN;	/*设置密码是否使能*/
    pParam->Password_Setting	= CONFIG_SETTING_PASSWORD;		/*默认设置密码*/
    pParam->Wheel_Diameter		= CONFIG_DEF_DIAMETER;			/*轮径索引值*/
    pParam->Speed_Limit			= CONFIG_SPEED_LIMIT;			/*默认限速值（倍率10）*/
    pParam->Handle_Limit		= CONFIG_HANDLE_LIMIT;			/*默认转把限速值（倍率10）*/
    pParam->Pas_Min				= CONFIG_PAS_MIN;				/*档位范围下限*/
    pParam->Pas_Max				= CONFIG_PAS_MAX;				/*档位范围上限*/
    pParam->Pas_Def				= CONFIG_DEF_PAS;				/*开机默认档位*/
    pParam->Service             = 1;                            /*保养服务标志，默认开启*/
    pParam->Current_Limit		= CONFIG_CURRENT_LIMIT;			/*默认限流值（倍率10）*/
    pParam->Assistant_Num		= CONFIG_ASSISTANT_NUM;			/*助力磁钢数*/
    pParam->Speed_Sensor_Num	= CONFIG_SPEED_SENSOR;			/*测速磁钢数*/
    pParam->Sensitivity			= CONFIG_SENSITIVITY;			/*助力灵敏度*/
    pParam->Start_Strength      = CONFIG_START_STRENGTH;

    pParam->Push_En				= CONFIG_PUSH_EN;				/*是否使能助推*/
    pParam->Idle_Time			= CONFIG_IDLE_TIME;				/*无操作后的关机时间，单位：分钟*/
    pParam->Mode				= CONFIG_DEF_MODE;				/*默认骑行模式是ECO模式*/
    pParam->SOC_Type			= CONFIG_SOC_TYPE;				/*默认按照百分比显示电量*/
    pParam->AL_Sensitivity		= CONFIG_DEF_AL_SENSITIVITY;	/*默认背光灵敏度*/
    pParam->Throttle_6KM		= 0;
    pParam->Throttle_PAS        = 0;

    pParam->PWM0_3[0]           = PWM_3_1;                      /*三档位时，1档的PWM值*/
    pParam->PWM0_3[1]           = PWM_3_2;                      /*三档位时，2档的PWM值*/
    pParam->PWM0_3[2]           = PWM_3_3;                      /*三档位时，3档的PWM值*/

    pParam->PWM0_5[0]           = PWM_5_1;                      /*5档位时，1档的PWM值*/
    pParam->PWM0_5[1]           = PWM_5_2;                      /*5档位时，2档的PWM值*/
    pParam->PWM0_5[2]           = PWM_5_3;                      /*5档位时，3档的PWM值*/
    pParam->PWM0_5[3]           = PWM_5_4;                      /*5档位时，4档的PWM值*/
    pParam->PWM0_5[4]           = PWM_5_5;                      /*5档位时，5档的PWM值*/

    pParam->PWM0_7[0]           = PWM_7_1;                      /*7档位时，1档的PWM值*/
    pParam->PWM0_7[1]           = PWM_7_2;                      /*7档位时，2档的PWM值*/
    pParam->PWM0_7[2]           = PWM_7_3;                      /*7档位时，3档的PWM值*/
    pParam->PWM0_7[3]           = PWM_7_4;                      /*7档位时，4档的PWM值*/
    pParam->PWM0_7[4]           = PWM_7_5;                      /*7档位时，5档的PWM值*/
    pParam->PWM0_7[5]           = PWM_7_6;                      /*7档位时，6档的PWM值*/
    pParam->PWM0_7[6]           = PWM_7_7;                      /*7档位时，7档的PWM值*/

    pParam->PWM0_9[0]           = PWM_9_1;                      /*9档位时，1档的PWM值*/
    pParam->PWM0_9[1]           = PWM_9_2;                      /*9档位时，2档的PWM值*/
    pParam->PWM0_9[2]           = PWM_9_3;                      /*9档位时，3档的PWM值*/
    pParam->PWM0_9[3]           = PWM_9_4;                      /*9档位时，4档的PWM值*/
    pParam->PWM0_9[4]           = PWM_9_5;                      /*9档位时，5档的PWM值*/
    pParam->PWM0_9[5]           = PWM_9_6;                      /*9档位时，6档的PWM值*/
    pParam->PWM0_9[6]           = PWM_9_7;                      /*9档位时，7档的PWM值*/
    pParam->PWM0_9[7]           = PWM_9_8;                      /*9档位时，8档的PWM值*/
    pParam->PWM0_9[8]           = PWM_9_9;                      /*9档位时，9档的PWM值*/

    pParam->Handle_Limit        = CONFIG_HANDLE_LIMIT;          /*默认转把限速值*/

    /*将参数值写入EEPROM*/
    EE_WriteBytes((uint8_t *)pParam,PARAMETER_ADDRESS,sizeof(stPARAM));		/*写入EEPROM*/
}

/******************************************************************************
** 功  能：复位骑行参数
** 参  数：pParam-指向骑行信息结构体的指针
** 返回值：无
** 备  注：ODO会清零
******************************************************************************/
void vParam_ResetRiding_With_ODO(stRIDING * pParam)
{
    pParam->Ver			= CURRENT_VER;
    pParam->ODO			= 0;
    pParam->Trip		= 0;
    pParam->Riding_Time = 0;
    pParam->Speed_Avg	= 0;
    pParam->Speed_Max	= 0;
    pParam->Total_Time	= 0;

    EE_WriteBytes((uint8_t *)pParam,RIDING_ADDRESS,sizeof(stRIDING));		/*写入EEPROM*/
}


/******************************************************************************
** 功  能：复位骑行参数
** 参  数：pParam-指向骑行信息结构体的指针
** 返回值：无
** 备  注：ODO不清零
******************************************************************************/
void vParam_ResetRiding_Without_ODO(stRIDING * pParam)
{
    pParam->Trip		= 0;
    pParam->Riding_Time = 0;
    pParam->Speed_Avg	= 0;
    pParam->Speed_Max	= 0;

    EE_WriteBytes((uint8_t *)pParam,RIDING_ADDRESS,sizeof(stRIDING));		/*写入EEPROM*/
}

/******************************************************************************
** 功  能：擦除恢复出厂设置标志位
** 参  数：无
** 返回值：无
** 备  注：每次刷程序后，恢复出厂设置标志会被置位为0xFFFFFFFF，下次上电，会将所有参数恢复默认。
**         该函数是将该标志设为0，下次上电后，不会将参数恢复默认。
**         该函数是将标志从0xFF写为0，因此无需扇区擦除，可直接写地址
******************************************************************************/
void vParam_ErasureResetFlag(void)
{

    uint8_t lucErrTimes = 0;
    HAL_FLASH_Unlock();
    while((HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,RESET_FLAG_ADDRESS,0) != HAL_OK) && (lucErrTimes < 3))
    {
        lucErrTimes++;  /*3次编程不成功，退出*/
    }
    HAL_FLASH_Lock();
}
